#ifndef DEV_IDE_H
#define DEV_IDE_H
#include "stdint.h"
#include "bitmap.h"
#include "list.h"
#include "sync.h"

/* 分区结构 */
struct partition {
    /* 在ide_init时, 被赋值*/
    uint32_t start_lba;       // 起始扇区
    uint32_t sec_cnt;         // 扇区数
    struct disk* my_disk;
    struct list_elem part_tag;
    char name[8];

/* 在filesys_init时, 被赋值 */
    struct super_block* sb;
    struct bitmap block_bitmap;
    struct bitmap inode_bitmap;
    struct list open_inodes;
};

/* 硬盘结构 */
struct disk {
    char name[8];
    struct ide_channel* my_channel;
    uint8_t dev_no;                  // master 0 or slave 1
    struct partition prim_parts[4];   
    struct partition logic_parts[8];  
};

/* ata通道结构 */
struct ide_channel {
    char name[8];
    uint16_t port_base;         // 通道的起始端口号, 0x20
    uint8_t irq_no;             // 本通道的中断号, 14/15
    struct lock ide_lock;       // 通道锁, 保证本通道被单独硬盘使用
    bool expecting_intr;        // 表示本通道正等待硬盘中断
    struct semaphore disk_done; // 驱动在等待硬盘中断时, 用于阻塞自己, 避免浪费cpu
    struct disk device[2];      // 一个通道两个硬盘,master/slave
};

// 通道数
uint8_t channel_cnt;
// 两个ide通道
struct ide_channel channels[2];
struct list partition_list; // 分区队列

void ide_init();
void ide_read(struct disk* hd, uint32_t lba, void* buf, uint32_t sec_cnt);
void ide_write(struct disk* hd, uint32_t lba, void* buf, uint32_t sec_cnt);
void intr_hd_handler(uint8_t irq_no);
#endif
